package com.itheima.d4_enum;

/**
 * @ClassName B
 * @Author 16799
 * @Date 2025/7/13 17:27
 * @Version 1.0
 * @Description TODO
 *
 * 扩展，抽象枚举
 **/
public enum B {
/*
    因为枚举类中有抽象方法，类中有抽象方法就要被定义为抽象类
    而枚举类的第一行都是要写几个常量的（这几个常量记住的就是被构造的枚举对象，例：public static final A X = new A();）
    但是问题来了，枚举类中有抽象方法所以是抽象类，而抽象类不能构建对象
    所以要创建对象，就需要进行重写抽象类方法，也就是用到了匿名内部类来重写抽象类方法,然后再构建枚举常量对象

    X()就相当于调用了枚举B的无参构造器，
    枚举类B是个抽象类，因为他有抽象方法，抽象类的对象要重写go方法，所以xy都要重写个go
    抽象类不能直接new，所以用匿名类，其实本质上也是创建了一个普通类，，重写抽象类（枚举）的抽象方法
    枚举类的常量都是枚举类的对象实例，由于抽象类没有实例，所以需要子类。抽象枚举里面的“常量”得用匿名内部类去实现抽象方法，相当于创建了子类
*/
    X(){    //X()就相当于调用了枚举B的无参构造器，然后重写抽象go方法
    @Override
    public void go() {

    }
},Y("曾季洪"){    //用逗号隔开，罗列其他对象，调用枚举B的有参构造器
        @Override
        public void go() {
            System.out.println(getName()+"要前进前进前进");
        }
    };

    //报错：Cannot inherit from enum 'com.itheima.d4_enum.B'
 /*  B Z = new B(){
        @Override
        public void go() {
            System.out.println("啦啦啦啦啦啦");
        }
    };
   Z.go();*/



    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    private B() {
    }

    private B(String name) {
        this.name = name;
    }

    public abstract void go();   //抽象类没有方法体

}
